/*
 * Indexador.cpp
 *
 *  Created on: 29/05/2013
 *      Author: jonathan
 */

#include "Indexador.h"

Indexador::Indexador( const FileName entrada,const FileName nombre) {
	this->repositorio = entrada;
	this->nombreRepo = nombre;
}

void Indexador::procesar(const FileName salida) {
	 OrganizadorTextos org(this->repositorio,salida, "estruct", "dat",this->nombreRepo);
	 cout << "PROCESANDO ARCHIVOS..." << endl;
     EnteroLargo cantArchivos = org.procesar();
     InfoRepositorioActual::Instance()->setCantidadArchivos(cantArchivos);
     Merger merger(salida, "estruct", "dat", cantArchivos);
     cout << "MERGEANDO ARCHIVOS AUXILIARES..." << endl;
     merger.procesar();
     cout << "ARMANDO INDICE..." << endl;
     this->armarIndice(salida);
     this->borrarTemporales(salida);
     this->agregarDatosAdmin(salida);
     cout << "LISTO" << endl;

}

void Indexador::agregarDatosAdmin(const FileName salida) {
    ArchivoDocumentos* ad = new ArchivoDocumentos(this->nombreRepo, salida, fstream::out | fstream::app);
    ad->agregarDatosAdmin();
    delete ad;
}

//lee el archivo auxiliar y va escribiendo los 3 archivos finales del indice
void Indexador::armarIndice(const FileName salida) {
    //armo las rutas aca a lo bestia
    string ruta = salida;
    ruta.append("/merge0.dat");
    ArchivoAuxiliar aux(ruta.c_str(), ios_base::in);
    ArchivoIndice indice(salida,this->nombreRepo,ios_base::out);

    EntradaAuxiliar* a = aux.next();
    Documento* doc = new Documento();
    doc->setNumero(a->getDocumento());
    list<EnteroLargo>::iterator it;
	for (it = a->getPosiciones().begin(); it != a->getPosiciones().end(); ++it) {
        doc->addPosicion(*it);
    }
    Termino* terminoActual = new Termino();
    terminoActual->setCaracteres(a->getTermino());
    terminoActual->addDocumento(doc);

    while (aux.hasNext()) {
        a = aux.next();
        doc = new Documento();
        doc->setNumero(a->getDocumento());
        for (it = a->getPosiciones().begin(); it != a->getPosiciones().end(); ++it) {
            doc->addPosicion(*it);
        }
        //si es el mismo termino solo agrego el documento a la lista del termino
        if (a->getTermino() == terminoActual->getCaracteres()) {
            terminoActual->addDocumento(doc);
            //caso especial ultima entrada
            if (!aux.hasNext())
                indice.escribir(*terminoActual);
        }
        //si es otro termino, ingreso el anterior en los archivos finales
        else {
           // chequeartermino(*terminoActual);
            indice.escribir(*terminoActual);
            Termino* borrado = terminoActual;
            delete borrado;
            terminoActual = new Termino();
            terminoActual->setCaracteres(a->getTermino());
            terminoActual->addDocumento(doc);
        }
    }
        indice.close();
        aux.close();
}

/*void Indexador::chequeartermino(Termino& termino) {
    cout << "EL TERMINO A ESCRIBIR ES " << termino.getCaracteres() << endl;
    list<Documento*> lista = *(termino.getDocumentos());
    list<Documento*>::iterator it;
    cout << "Y SUS DOCUMENTOS SON ";

    for (it = lista.begin(); it != lista.end(); ++it)
			cout << (*it)->getNumero() << " ";

    cout << endl;

} */

void Indexador::borrarTemporales(const FileName salida) {
    string ruta = salida;
    ruta.append("/merge0.dat");
    remove(ruta.c_str());

    for (EnteroLargo i=0; i<InfoRepositorioActual::Instance()->getCantidadArchivos();i++) {
        ruta = salida;
        std::ostringstream oss;
        ruta.append("/estruct");
        oss << i;
        ruta.append(oss.str());
        ruta.append(".dat");
        remove(ruta.c_str());
    }
}

Indexador::~Indexador() {
	// TODO Auto-generated destructor stub
}
